<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Include/funcobject.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Include/funcobject.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> 
<a name="2" /><span class="True">       2:</span> <span class="k">/* Function object interface */</span>
<a name="3" /><span class="True">       3:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_noref.html#_UHlfRlVOQ09CSkVDVF9IXzA_"><span class="b">Py_FUNCOBJECT_H</span></a>
<a name="5" /><span class="True">       5:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlfRlVOQ09CSkVDVF9IXzA_"><span class="b">Py_FUNCOBJECT_H</span></a>
<a name="6" /><span class="False">       6:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="7" /><span class="False">       7:</span> <span class="m">extern</span> <span class="e">&quot;C&quot;</span> <span class="f">{</span>
<a name="8" /><span class="True">       8:</span> <span class="f">#</span><span class="n">endif</span>
<a name="9" /><span class="True">       9:</span> 
<a name="10" /><span class="True">      10:</span> <span class="k">/* Function objects and code objects should not be confused with each other:</span>
<a name="11" /><span class="True">      11:</span> <span class="k"> *</span>
<a name="12" /><span class="True">      12:</span> <span class="k"> * Function objects are created by the execution of the &apos;def&apos; statement.</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> * They reference a code object in their __code__ attribute, which is a</span>
<a name="14" /><span class="True">      14:</span> <span class="k"> * purely syntactic object, i.e. nothing more than a compiled version of some</span>
<a name="15" /><span class="True">      15:</span> <span class="k"> * source code lines.  There is one code object per source code &quot;fragment&quot;,</span>
<a name="16" /><span class="True">      16:</span> <span class="k"> * but each code object can be referenced by zero or many function objects</span>
<a name="17" /><span class="True">      17:</span> <span class="k"> * depending only on how many times the &apos;def&apos; statement in the source was</span>
<a name="18" /><span class="True">      18:</span> <span class="k"> * executed so far.</span>
<a name="19" /><span class="True">      19:</span> <span class="k"> */</span>
<a name="20" /><span class="True">      20:</span> 
<a name="21" /><span class="True">      21:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="f">{</span>
<a name="22" /><span class="True">      22:</span>     <a href="macros_ref.html#_UHlPYmplY3RfSEVBRF8w"><span class="b">PyObject_HEAD</span></a>
<a name="23" /><span class="True">      23:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_code</span><span class="f">;</span>    <span class="k">/* A code object, the __code__ attribute */</span>
<a name="24" /><span class="True">      24:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_globals</span><span class="f">;</span>    <span class="k">/* A dictionary (other mappings won&apos;t do) */</span>
<a name="25" /><span class="True">      25:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_defaults</span><span class="f">;</span>    <span class="k">/* NULL or a tuple */</span>
<a name="26" /><span class="True">      26:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_kwdefaults</span><span class="f">;</span>    <span class="k">/* NULL or a dict */</span>
<a name="27" /><span class="True">      27:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_closure</span><span class="f">;</span>    <span class="k">/* NULL or a tuple of cell objects */</span>
<a name="28" /><span class="True">      28:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_doc</span><span class="f">;</span>        <span class="k">/* The __doc__ attribute, can be anything */</span>
<a name="29" /><span class="True">      29:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_name</span><span class="f">;</span>    <span class="k">/* The __name__ attribute, a string object */</span>
<a name="30" /><span class="True">      30:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_dict</span><span class="f">;</span>    <span class="k">/* The __dict__ attribute, a dict or NULL */</span>
<a name="31" /><span class="True">      31:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_weakreflist</span><span class="f">;</span>    <span class="k">/* List of weak references */</span>
<a name="32" /><span class="True">      32:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_module</span><span class="f">;</span>    <span class="k">/* The __module__ attribute, can be anything */</span>
<a name="33" /><span class="True">      33:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_annotations</span><span class="f">;</span>    <span class="k">/* Annotations, a dict or NULL */</span>
<a name="34" /><span class="True">      34:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func_qualname</span><span class="f">;</span>    <span class="k">/* The qualified name */</span>
<a name="35" /><span class="True">      35:</span> 
<a name="36" /><span class="True">      36:</span>     <span class="k">/* Invariant:</span>
<a name="37" /><span class="True">      37:</span> <span class="k">     *     func_closure contains the bindings for func_code-&gt;co_freevars, so</span>
<a name="38" /><span class="True">      38:</span> <span class="k">     *     PyTuple_Size(func_closure) == PyCode_GetNumFree(func_code)</span>
<a name="39" /><span class="True">      39:</span> <span class="k">     *     (func_closure may be NULL if PyCode_GetNumFree(func_code) == 0).</span>
<a name="40" /><span class="True">      40:</span> <span class="k">     */</span>
<a name="41" /><span class="True">      41:</span> <span class="f">}</span> <span class="b">PyFunctionObject</span><span class="f">;</span>
<a name="42" /><span class="True">      42:</span> 
<a name="43" /><span class="True">      43:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PyFunction_Type</span><span class="f">;</span>
<a name="44" /><span class="True">      44:</span> 
<a name="45" /><span class="True">      45:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9DaGVja18w"><span class="b">PyFunction_Check</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">op</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PyFunction_Type</span><span class="f">)</span>
<a name="46" /><span class="True">      46:</span> 
<a name="47" /><span class="True">      47:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_New</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="48" /><span class="True">      48:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_NewWithQualName</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="49" /><span class="True">      49:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_GetCode</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="50" /><span class="True">      50:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_GetGlobals</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="51" /><span class="True">      51:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_GetModule</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="52" /><span class="True">      52:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_GetDefaults</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="53" /><span class="True">      53:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyFunction_SetDefaults</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="54" /><span class="True">      54:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_GetKwDefaults</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="55" /><span class="True">      55:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyFunction_SetKwDefaults</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="56" /><span class="True">      56:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_GetClosure</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="57" /><span class="True">      57:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyFunction_SetClosure</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="58" /><span class="True">      58:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyFunction_GetAnnotations</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="59" /><span class="True">      59:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyFunction_SetAnnotations</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="60" /><span class="True">      60:</span> 
<a name="61" /><span class="True">      61:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="62" /><span class="True">      62:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyFunction_FastCallDict</span><span class="f">(</span>
<a name="63" /><span class="True">      63:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func</span><span class="f">,</span>
<a name="64" /><span class="True">      64:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="f">*</span><span class="b">args</span><span class="f">,</span>
<a name="65" /><span class="True">      65:</span>     <span class="b">Py_ssize_t</span> <span class="b">nargs</span><span class="f">,</span>
<a name="66" /><span class="True">      66:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">kwargs</span><span class="f">)</span><span class="f">;</span>
<a name="67" /><span class="True">      67:</span> 
<a name="68" /><span class="True">      68:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">_PyFunction_FastCallKeywords</span><span class="f">(</span>
<a name="69" /><span class="True">      69:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">func</span><span class="f">,</span>
<a name="70" /><span class="True">      70:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="f">*</span><span class="b">stack</span><span class="f">,</span>
<a name="71" /><span class="True">      71:</span>     <span class="b">Py_ssize_t</span> <span class="b">nargs</span><span class="f">,</span>
<a name="72" /><span class="True">      72:</span>     <span class="b">PyObject</span> <span class="f">*</span><span class="b">kwnames</span><span class="f">)</span><span class="f">;</span>
<a name="73" /><span class="True">      73:</span> <span class="f">#</span><span class="n">endif</span>
<a name="74" /><span class="True">      74:</span> 
<a name="75" /><span class="True">      75:</span> <span class="k">/* Macros for direct access to these values. Type checks are *not*</span>
<a name="76" /><span class="True">      76:</span> <span class="k">   done, so use with care. */</span>
<a name="77" /><span class="True">      77:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9HRVRfQ09ERV8w"><span class="b">PyFunction_GET_CODE</span></a><span class="f">(</span><span class="b">func</span><span class="f">)</span> \
<a name="78" /><span class="True">      78:</span>         <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyFunctionObject</span> <span class="f">*</span><span class="f">)</span><span class="b">func</span><span class="f">)</span> <span class="f">-&gt;</span> <span class="b">func_code</span><span class="f">)</span>
<a name="79" /><span class="True">      79:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9HRVRfR0xPQkFMU18w"><span class="b">PyFunction_GET_GLOBALS</span></a><span class="f">(</span><span class="b">func</span><span class="f">)</span> \
<a name="80" /><span class="True">      80:</span>     <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyFunctionObject</span> <span class="f">*</span><span class="f">)</span><span class="b">func</span><span class="f">)</span> <span class="f">-&gt;</span> <span class="b">func_globals</span><span class="f">)</span>
<a name="81" /><span class="True">      81:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9HRVRfTU9EVUxFXzA_"><span class="b">PyFunction_GET_MODULE</span></a><span class="f">(</span><span class="b">func</span><span class="f">)</span> \
<a name="82" /><span class="True">      82:</span>     <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyFunctionObject</span> <span class="f">*</span><span class="f">)</span><span class="b">func</span><span class="f">)</span> <span class="f">-&gt;</span> <span class="b">func_module</span><span class="f">)</span>
<a name="83" /><span class="True">      83:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9HRVRfREVGQVVMVFNfMA__"><span class="b">PyFunction_GET_DEFAULTS</span></a><span class="f">(</span><span class="b">func</span><span class="f">)</span> \
<a name="84" /><span class="True">      84:</span>     <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyFunctionObject</span> <span class="f">*</span><span class="f">)</span><span class="b">func</span><span class="f">)</span> <span class="f">-&gt;</span> <span class="b">func_defaults</span><span class="f">)</span>
<a name="85" /><span class="True">      85:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9HRVRfS1dfREVGQVVMVFNfMA__"><span class="b">PyFunction_GET_KW_DEFAULTS</span></a><span class="f">(</span><span class="b">func</span><span class="f">)</span> \
<a name="86" /><span class="True">      86:</span>     <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyFunctionObject</span> <span class="f">*</span><span class="f">)</span><span class="b">func</span><span class="f">)</span> <span class="f">-&gt;</span> <span class="b">func_kwdefaults</span><span class="f">)</span>
<a name="87" /><span class="True">      87:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9HRVRfQ0xPU1VSRV8w"><span class="b">PyFunction_GET_CLOSURE</span></a><span class="f">(</span><span class="b">func</span><span class="f">)</span> \
<a name="88" /><span class="True">      88:</span>     <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyFunctionObject</span> <span class="f">*</span><span class="f">)</span><span class="b">func</span><span class="f">)</span> <span class="f">-&gt;</span> <span class="b">func_closure</span><span class="f">)</span>
<a name="89" /><span class="True">      89:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlGdW5jdGlvbl9HRVRfQU5OT1RBVElPTlNfMA__"><span class="b">PyFunction_GET_ANNOTATIONS</span></a><span class="f">(</span><span class="b">func</span><span class="f">)</span> \
<a name="90" /><span class="True">      90:</span>     <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">PyFunctionObject</span> <span class="f">*</span><span class="f">)</span><span class="b">func</span><span class="f">)</span> <span class="f">-&gt;</span> <span class="b">func_annotations</span><span class="f">)</span>
<a name="91" /><span class="True">      91:</span> 
<a name="92" /><span class="True">      92:</span> <span class="k">/* The classmethod and staticmethod types lives here, too */</span>
<a name="93" /><span class="True">      93:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PyClassMethod_Type</span><span class="f">;</span>
<a name="94" /><span class="True">      94:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PyStaticMethod_Type</span><span class="f">;</span>
<a name="95" /><span class="True">      95:</span> 
<a name="96" /><span class="True">      96:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyClassMethod_New</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="97" /><span class="True">      97:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span> <span class="b">PyStaticMethod_New</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="98" /><span class="True">      98:</span> 
<a name="99" /><span class="False">      99:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="100" /><span class="False">     100:</span> <span class="f">}</span>
<a name="101" /><span class="True">     101:</span> <span class="f">#</span><span class="n">endif</span>
<a name="102" /><span class="True">     102:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_FUNCOBJECT_H */</span>
<a name="103" /><span class="True">     103:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* Py_LIMITED_API */</span>
<a name="104" /><span class="True">     104:</span> </pre>
  </body>
</html>
